package pre.web;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import pre.service.CommService;
import pre.service.boardService;
import pre.vo.boardVO;
import pre.vo.commentVO;

@Controller
public class CommController {
	//두개의 service클래스를 이용
	@Resource(name="commService")
	private CommService commService;
	
	@Resource(name="boardService")
	private boardService boardService;
	
	/*
	 * 게시판이 보이는 메인 페이지 
	 * @return "/mainFrame"
	 */
	@RequestMapping("/main.do")
	public String index() throws Exception{
		return "/mainFrame";
	}
	@RequestMapping("/welcome.do")
	public String welcome() throws Exception{
		return "/welcome";
	}
	
	/*
	 * 게시물 내용을 확인한다. 
	 * @param String num(선택한 게시물 번호), Model model
	 * @return "/detailView"
	 */
	@RequestMapping("/board.do")
	public String detailView(@RequestParam(value="num", defaultValue="") String num, Model model) throws Exception{
		if(num.isEmpty()){
			//num이 파라미터에 없으면 mainView로 이동.
			return "redirect:/main.do";
		} else {
			boardVO board = boardService.selectBoardView(Integer.parseInt(num));//해당 게시물 번호의 정보를 가져와 boardVO객체에 담는다.
			ArrayList commList = commService.selectCommList(num);//해당 게시물의 댓글 목록를 가져와 List에 담는다.
			if(!commList.isEmpty()){//댓글이 있는 경우
				model.addAttribute("commList", commList);//화면으로 댓글 정보를 전달할 객체에 정보를 담는다
			}
			model.addAttribute("board", board);	// boardVO를 model(View에 전달할 객체)담는다.	
			return "/detailView";//게시물의 상세화면을 호출
		}
	}
	
	/*
	 * 게시물의 내용을 수정한다.
	 * @param String num(수정할 게시물의 번호), Model model
	 * @ruturn "/modifyView"
	 */
	@RequestMapping("/modifyBoard.do")
	public String modifyView(@RequestParam("num") String num, Model model) throws Exception{
		//수정할 게시물의 번호를 파라미터로 받아 해당 게시글의 정보를 boardVO객체 변수에 저장
		boardVO board = boardService.selectBoardView(Integer.parseInt(num));
		model.addAttribute("board", board);	//화면으로 전달할 객체 정보를 model 객체에 저장
		return "/modifyView";
	}
	/*
	 * 게시물의 내용을 수정한다.
	 * @param boardVO modifyBoard(수정된 게시글 정보), Model model
	 * @ruturn "/detailView"
	 */
	@RequestMapping("/modify.do")
	public String modifyBoard(boardVO modifyBoard, Model model)throws Exception{
		boardVO board;
		board = boardService.updateBoardView(modifyBoard);//boardService의 게시물의 수정된 내용을 갱신하는 메소드의 리턴 값을 저장
		model.addAttribute("board",board);//화면으로 전달할 객체 정보를 model객체에 저장
		return "/detailView";
	}
	/*
	 * 게시물의 댓글 및 댓글 작성창을 보여준다. 
	 * 1. 게시판객체(board VO) 선언
	 * 2. 선언한 게시판 객체 변수에 set메소드를 이용해 파라미터로 받은 num값(borad_NUM)을 int 형변환하여 set함수로 이용하여 저장
	 * 3. 회원가입이 절차가 없기 때문에 임의로 RegName을 저장한다. 나중에 댓글 작성자로 활용. 함수 setRegName("hanbin")
	 * 4. num을 이용하여 댓글 리스트를 받아 온다. comService.selectCommList(num)
	 * 5. 만약 댓글 리스트가 있다면 model담는다.
	 * 6. boardVo를 model담는다.
	 * @param num 게시글의 번호
	 * @return "/commView"
	 */
	@RequestMapping("/comment.do")
	public String commView(@RequestParam("num") String num, Model model) throws Exception{
	//	System.out.println("c"+num);
		
		boardVO temp = new boardVO();
		temp.setNum(Integer.parseInt(num));
		temp.setRegName("hanbin");
		ArrayList commList = commService.selectCommList(num);//bnum올 댓글테이블 접근
		if(!commList.isEmpty()){
			model.addAttribute("commList", commList);
		}
		model.addAttribute("board", temp);
		return "/commView";
	}
	
	/*
	 * 새로운 댓글을 등록한다. 
	 * 1. 서비스객체를 이용하여 새로운 댓글을 삽입한다.
	 * 2. 리턴할때 게시판 번호를 파라미터로 붙여서 리턴한다.
	 * @param c 새로 등록할 댓글
	 * @return "/comment.do" redirect 로 댓글창을 리프레쉬한다.
	 */
	@RequestMapping("/addComment.do")
	public String addComment(@ModelAttribute("commVO") commentVO c, Model model) throws Exception{
//		System.out.println(c.toString());
		commService.insertComm(c);
		
		return "redirect:/comment.do?num="+c.getBnum();
		
	}
	
	/*
	 * 댓글을 수정한다. 
	 * 1. req객체를 사용하여 모든 파라미터 이름을 enumeration 객체로 받는다
	 * 2. hashmap 객체를 생성한다.key와 value를 String으로 지정
	 * 3. while문을 이용하여 enumeration 객체에서 모든요소를 String으로 받은 다음
	 *    파라미터의 값을 String으로 받는다
	 * 4. String으로 받은 것을 hashmap 객체에 key,value로 저장한다
	 * 5. while문 밖에서 hashmap 객체를 이용하여 수정내용을 update를 한다.
	 * 6. hashmap에서 키가 "new_content"를 model에 담는다
	 * 
	 * @param req객체로 파라미터를 가져온다.
	 * @return "/temp" 갱신할 댓글 내용을 메세지에 담아 리턴한다.
	 */
	@RequestMapping("/modifyComment.do")
	public String modifyComment(HttpServletRequest req, Model model) throws Exception{
		Enumeration enu = req.getParameterNames();
		HashMap<String, String> map = new HashMap<String, String>();
		while (enu.hasMoreElements()) {
		   String key = (String)enu.nextElement() ;
		   String value = req.getParameter(key);
		   map.put(key, value);
		   System.out.println(key +":"+value);
		}
		commService.updateComm(map);
		model.addAttribute("message", map.get("new_content"));
		return "/temp";
	}
	
	/*
	 * 댓글을 삭제한다.
	 * 1. cnum변수(댓글번호)를 String 형으로 선언해 jsp파일로 부터 delNum값을 받아 저장
	 * 2. bnum(게시판번호)를 String 형으로 선언해 jsp파일로 부터 bnum값을 받아 저장
	 * 3. 서비스(commSerivce)의 삭제기능 메소드(deleteComm(댓글번호))를 호출한다.
	 * 4. 게시판번호를 이용하여 댓글 사이즈를 받는다
	 * 5. 댓글 사이즈를 model에 담는다
	 * @param req객체로 삭제할 댓글정보를 파라미터로 가져온다.
	 * @return "/temp" 삭제완료를 메세지에 담아 리턴한다.
	 */
	@RequestMapping("/deleteComment.do")
	public String deleteComment(HttpServletRequest req, Model model) throws Exception{
		String cnum = (String) req.getParameter("delNum");
		String bnum = (String) req.getParameter("bnum");
//		System.out.println(cnum+" "+bnum);
		commService.deleteComm(cnum);
		int size = commService.getLength(bnum);
		model.addAttribute("message", size);
		return "/temp";
	}
}
